package com.hmall.item.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmall.common.PageDto;
import com.hmall.item.mapper.ItemMapper;
import com.hmall.item.pojo.Item;
import com.hmall.item.service.IItemService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Service
public class ItemService extends ServiceImpl<ItemMapper, Item> implements IItemService {

    @Autowired
    private ItemMapper itemMapper;

    /**
     * 分页查询商品信息
     * @param page 当前页码
     * @param size 每页条数
     * @return
     */
    @Override
    public PageDto<Item> selectPage(Integer page, Integer size) {
        //1 创建分页对象
        Page<Item> p=new Page<>(page,size);
        //2 开始分页查询
        itemMapper.selectPage(p,null);
        //3 封装分页结果
        return new PageDto<>(p.getTotal(),p.getRecords());
    }

    /**
     * 商品的上架和下架
     * @param id 商品id
     * @param status 商品状态 1-上架，2-下架
     */
    @Override
    @Transactional
    public void status(Long id, Integer status) {
        //构建修改条件的修改的值:update tb_item set status=#{status} where id=#{id}
        LambdaUpdateWrapper<Item> lambdaUpdateWrapper=new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.set(Item::getStatus,status);  //设置修改状态
        lambdaUpdateWrapper.eq(Item::getId,id); //设置条件
        //修改状态
        itemMapper.update(null,lambdaUpdateWrapper);
    }


    /**
     * 根据id更新库存
     * @param id 唯一标识id
     * @param stock 要更新的库存数
     */
    @Override
    @Transactional
    public void updateStock(Long id, Integer stock) {
        //1 查询库存
        Item item = itemMapper.selectById(id);
        //2 库存不够就抛出异常
        if(item==null || item.getStock()<=0){
            throw new RuntimeException("库存不够，不能进行购买!");
        }
        //3 库存够就修改库存(stock为整数就是加库存，为负数就是扣库存)和销量
        item.setStock(item.getStock()+stock);
        item.setSold(item.getSold()-stock);  //销量和库存是反着的
        itemMapper.updateById(item);
    }
}
